local core = require("apisix.core")

local _M = {}

-------------------------------- header --------------------------------
-- 获取所有header参数
-- type(core.request.headers(ctx)) => table
function _M.get_header_params(ctx)
    return core.request.headers(ctx)
end

-- 获取指定header的值
function _M.get_header_value(ctx, key, default_value)
    -- 从请求头获取指定key的值,如果不存在则返回默认值
    return core.request.header(ctx, key) or default_value
end

-- 获取指定header的值，如果没有值则返回空字符串
function _M.get_header_value_str(ctx, key, default_value)
    -- 从请求头获取指定key的值,如果不存在则返回默认值
    return core.request.header(ctx, key) or default_value or ""
end

-- 设置指定header的值
function _M.set_header(ctx, key, value)
    return core.request.set_header(ctx, key, value)
end

-- 添加指定header的值
function _M.add_header(ctx, key, value)
    return core.request.add_header(ctx, key, value)
end

-------------------------------- query --------------------------------
-- 获取所有query参数
-- type(core.request.get_uri_args(ctx)) => table
function _M.get_query_params(ctx)
    return core.request.get_uri_args(ctx)
end

-- 获取指定query的值
function _M.get_query_value(ctx, key, default_value)
    return core.request.get_uri_args(ctx)[key] or default_value
end

-------------------------------- body --------------------------------
-- 获取所有body参数
-- type(core.request.get_body()) => string
-- content-type: application/json
function _M.get_body_params()
    return core.request.get_body()
end

-- 获取指定body的值
-- 如果body不为空，则会反解为json对象，并返回指定key的值
function _M.get_body_value(key, default_value)
    if core.request.get_body() then
        local body_array = core.json.decode(core.request.get_body())
        if type(body_array) == "table" then
            return body_array[key] or default_value
        end
    end
    return default_value
end

-- 获取所有post参数
-- type(core.request.get_post_args(ctx)) => table
-- content-type: application/x-www-form-urlencoded
function _M.get_post_params(ctx)
    return core.request.get_post_args(ctx)
end

-- 获取指定post的值
function _M.get_post_value(ctx, key, default_value)
    return core.request.get_post_args(ctx)[key] or default_value
end

-- 获取请求体参数
function _M.get_body_all_params(ctx)
    local content_type = _M.get_header_value(ctx, "Content-Type", "")
    content_type = string.lower(content_type:match("^[^;]+") or "")

    local body_params = {}
    if content_type == "application/json" then
        body_params = core.json.decode(core.request.get_body())
    else
        body_params = core.request.get_post_args(ctx)
    end
    return body_params
end

return _M
